<?php

require_once 'Lib/PHPExcel.php';

/**
 * Model che rappresenta un ordine nel DB.
 */
class Ordine extends StdModel
{

	private static $singleton = NULL;

	/**
	 * Ritorna una istanza globale di questo model.
	 * @return mixed La istanza globale.
	 */
	public static function getInstance()
	{
		if(self::$singleton == NULL)
			self::$singleton = new Ordine();
		return self::$singleton;
	}

	/*
	 * Specifiche attributi del tipo del Model rappresentato da questa classe
	 */
	public $attribTableName = "Ordine";
	public $attribLabel = array(STD_ID, "Data");
	public $attribNames = array(STD_ID, "NOrdine", "idAgente", "idAziendaRappresentata", "idCliente", "idOfferta", "BancaAziendaRappresentata", "IbanAziendaRappresentata", "OpzioneIbanBancaAziendaRappresentata", "Indirizzo", "Contatto", "TermineDiConsegna", "OrdineDelCliente", "Cup", "Cig", "Trasporto", "Pagamento", "BancaCliente", "IbanCliente", "E_MailTecnica", "E_MailCommerciale", "E_MailAmministrativa", "E_MailPec", "Data", "Note");
	public $attribExcludeFromAdd = array(STD_ID);
	public $attribExcludeFromEdit = array(STD_ID);
	public $attribLongNames = array(STD_ID => STD_ID, "NOrdine" => "Numero ordine", "idAgente" => "Agente", "idAziendaRappresentata" => "Produttore", "idCliente" => "Cliente", "idOfferta" => "Offerta da cui proviene", "BancaAziendaRappresentata" => "Banca del produttore", "IbanAziendaRappresentata" => "IBAN del produttore", "OpzioneIbanBancaAziendaRappresentata" => "Mostra banca e IBAN del produttore nella stampa", "Indirizzo" => "Indirizzo di consegna", "Contatto" => "Contatto", "TermineDiConsegna" => "Termini di consegna", "OrdineDelCliente" => "Ordine del cliente", "Cup" => "Cup", "Cig" => "Cig", "Trasporto" => "Trasporto", "Pagamento" => "Pagamento", "BancaCliente" => "Banca cliente", "IbanCliente" => "IBAN cliente", "E_MailTecnica" => "E-Mail tecnico", "E_MailCommerciale" => "E-Mail commerciale", "E_MailAmministrativa" => "E-Mail amministrativo", "E_MailPec" => "E-Mail PEC", "Data" => "Data", "Note" => "Note");
	public $attribIsImportant = array(STD_ID => 2, "NOrdine" => 1, "idAgente" => 1, "idAziendaRappresentata" => 1, "idCliente" => 1, "idOfferta" => 0, "BancaAziendaRappresentata" => 0, "IbanAziendaRappresentata" => 0, "OpzioneIbanBancaAziendaRappresentata" => 0, "Indirizzo" => 0, "Contatto" => 0, "TermineDiConsegna" => 0, "OrdineDelCliente" => 1, "Cup" => 0, "Cig" => 0, "Trasporto" => 0, "Pagamento" => 0, "BancaCliente" => 0, "IbanCliente" => 0, "E_MailTecnica" => 0, "E_MailCommerciale" => 0, "E_MailAmministrativa" => 0, "E_MailPec" => 0, "Data" => 1, "Note" => 0);
	public $attribIsNumeric = array(STD_ID => true, "NOrdine" => true, "idAgente" => true, "idAziendaRappresentata" => true, "idCliente" => true, "idOfferta" => true, "BancaAziendaRappresentata" => false, "IbanAziendaRappresentata" => false, "OpzioneIbanBancaAziendaRappresentata" => true, "Indirizzo" => false, "Contatto" => false, "TermineDiConsegna" => false, "OrdineDelCliente" => false, "Cup" => false, "Cig" => false, "Trasporto" => false, "Pagamento" => false, "BancaCliente" => false, "IbanCliente" => false, "E_MailTecnica" => false, "E_MailCommerciale" => false, "E_MailAmministrativa" => false, "E_MailPec" => false, "Data" => false, "Note" => false);
	public $attribIsForeignKey = array(STD_ID => false, "NOrdine" => false, "idAgente" => "Agenti", "idAziendaRappresentata" => "Aziende Rappresentate", "idCliente" => "Clienti", "idOfferta" => "Offerte", "BancaAziendaRappresentata" => false, "IbanAziendaRappresentata" => false, "OpzioneIbanBancaAziendaRappresentata" => false, "Indirizzo" => false, "Contatto" => false, "TermineDiConsegna" => false, "OrdineDelCliente" => false, "Cup" => false, "Cig" => false, "Trasporto" => false, "Pagamento" => false, "BancaCliente" => false, "IbanCliente" => false, "E_MailTecnica" => false, "E_MailCommerciale" => false, "E_MailAmministrativa" => false, "E_MailPec" => false, "Data" => false, "Note" => false);

	const joinTable = "(Ordine LEFT JOIN Agente ON Ordine.idAgente = Agente.ID) LEFT JOIN AziendaRappresentata ON Ordine.idAziendaRappresentata = AziendaRappresentata.ID";
	const joinSelect = "Ordine.*, Agente.Nome AS NomeAgente, Agente.Cognome AS CognomeAgente, AziendaRappresentata.Ragsoc AS RagsocAziendaRappresentata";
	const joinTableForSearchQuery = "(((Ordine LEFT JOIN Agente ON Ordine.idAgente = Agente.ID) LEFT JOIN AziendaRappresentata ON Ordine.idAziendaRappresentata = AziendaRappresentata.ID) LEFT JOIN Cliente ON Ordine.idCliente = Cliente.ID) LEFT JOIN Offerta ON Ordine.idOfferta = Offerta.ID";
	const joinSelectForSearchQuery = "Ordine.*, Agente.Nome AS NomeAgente, Agente.Cognome AS CognomeAgente, AziendaRappresentata.Ragsoc AS RagsocAziendaRappresentata, Cliente.Ragsoc AS RagsocCliente, Cliente.TipoCliente AS TipoCliente, Offerta.Oggetto AS OggettoOfferta";

	/*
	 * Specifiche per gli elementi form associati agli attributi
	 */
	private static $attribHTMLFormValue = array(STD_ID => FORM_HIDDEN, "NOrdine" => FORM_NUMERIC, "idAgente" => FORM_EXTERNAL_SELECTOR, "idAziendaRappresentata" => FORM_EXTERNAL_SELECTOR, "idCliente" => FORM_EXTERNAL_SELECTOR, "idOfferta" => FORM_EXTERNAL_SELECTOR, "BancaAziendaRappresentata" => FORM_TEXT, "IbanAziendaRappresentata" => FORM_TEXT, "OpzioneIbanBancaAziendaRappresentata" => FORM_CHECKBOX, "Indirizzo" => FORM_TEXT, "Contatto" => FORM_TEXT, "TermineDiConsegna" => FORM_TEXT, "OrdineDelCliente" => FORM_TEXT, "Cup" => FORM_TEXT, "Cig" => FORM_TEXT, "Trasporto" => FORM_TEXT, "Pagamento" => FORM_TEXT, "BancaCliente" => FORM_TEXT, "IbanCliente" => FORM_TEXT, "E_MailTecnica" => FORM_TEXT, "E_MailCommerciale" => FORM_TEXT, "E_MailAmministrativa" => FORM_TEXT, "E_MailPec" => FORM_TEXT, "Data" => FORM_DATE, "Note" => FORM_TEXT_LONG);
	private static $attribHTMLFormIsMandatory = array(STD_ID => true, "NOrdine" => false, "idAgente" => true, "idAziendaRappresentata" => true, "idCliente" => true, "idOfferta" => false, "BancaAziendaRappresentata" => false, "IbanAziendaRappresentata" => false, "OpzioneIbanBancaAziendaRappresentata" => false, "Indirizzo" => true, "Contatto" => false, "TermineDiConsegna" => true, "OrdineDelCliente" => false, "Cup" => false, "Cig" => false, "Trasporto" => true, "Pagamento" => true, "BancaCliente" => false, "IbanCliente" => false, "E_MailTecnica" => false, "E_MailCommerciale" => false, "E_MailAmministrativa" => false, "E_MailPec" => false, "Data" => true, "Note" => false);
	/*
	private static $attribHTMLFormValueDefaultVal = array("Pagamento" => "Vs solito o da concordarsi in sede d&#39;ordine",
		"Trasporto" => "Incluso", "Note" => "Prezzi netti, IVA esclusa, salvo errori ed omissioni; Validit&agrave; 30 gg.");
	*/
	private static $attribHTMLFormExtSelAssoc = array("idAgente" => NULL,
			"idCliente" => array("Pagamento" => "CondizioniPagamento",
								 "BancaCliente" => "Banca", "IbanCliente" => "IBAN",
								 "E_MailTecnica" => "E_MailTecnico", "E_MailCommerciale" => "E_MailCommerciale",
								 "E_MailAmministrativa" => "E_MailAmministrativo", "E_MailPec" => "E_MailPec"),
			"idOfferta" => array("Trasporto" => "Trasporto", "TermineDiConsegna" => "Consegna"),
			"idAziendaRappresentata" => array("BancaAziendaRappresentata" => "Banca", "IbanAziendaRappresentata" => "Iban"));

	/**
	 * Restituisce l'HTML per creare un campo di un form adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo sarà vuoto e dovrà
	 * servire per la creazione di una nuova istanza in DB di questo model.
	 * @param string $attribName Nome dell'attributo su cui creare il campo.
	 * @return string Stringa contenente l'HTML dell'elemento creato.
	 */
	public function getAddFormCodeFromAttribute($db,$attribName)
	{
		if(!isset(self::$attribHTMLFormValue[$attribName]) || $attribName == STD_ID || $attribName == "NOrdine")
			return "";
		//$defVal = isset(self::$attribHTMLFormValueDefaultVal[$attribName]) ? self::$attribHTMLFormValueDefaultVal[$attribName] : "";
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, "" /*$defVal*/, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT_LONG: return ModelUtils::getLongTextFormElement($attribName, "" /*$defVal*/, NULL, NULL, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_CHECKBOX: return ModelUtils::getCheckBoxFormElement($attribName, "true", false, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_EXTERNAL_SELECTOR:
				if($attribName == "idAgente")
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Agente", "", "", self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				elseif($attribName == "idCliente")
				{
					$defIdToSet = isset($this->dataTupla["idCliente"]) && $this->dataTupla["idCliente"] != NULL ? $this->dataTupla["idCliente"] : "";
					$defIdLabelToSet = "";
					if($defIdToSet != "")
						$defIdLabelToSet = $this->getCliente($db) == NULL ? "" : $this->getCliente($db)->getLabel();
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Cliente", $defIdToSet, $defIdLabelToSet, self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				}
				elseif($attribName == "idOfferta")
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Offerta", "", "", self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				elseif($attribName == "idAziendaRappresentata")
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "AziendaRappresentata", "", "", self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
			//per il campo data il valore di default è la data corrente
			case FORM_DATE: return ModelUtils::getDateFormElement($attribName, time(), self::$attribHTMLFormIsMandatory[$attribName]);
			default: return "";
		}
		return "";
	}

	/**
	 * Restituisce l'HTML per creare un campo di testo adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo conterrà il valore
	 * attualmente assunto da questo attributo in questa tupla.
	 * @param DatabaseManager $db Database su cui effettuare una possibile
	 * interrogazione.
	 * @param string $attribName Nome dell'attributo di cui creare il codice.
	 * @return string Il codice HTML dell'elemento form corrispondente.
	 */
	public function getEditFormCodeFromAttribute($db, $attribName)
	{
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_HIDDEN: return ModelUtils::getHiddenFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_NUMERIC: return ModelUtils::getNumericFormElement($attribName, $this->dataTupla[$attribName], 1)." (Lasciare vuoto per generare automaticamente)";
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT_LONG: return ModelUtils::getLongTextFormElement($attribName, $this->dataTupla[$attribName], NULL, NULL, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_CHECKBOX: return ModelUtils::getCheckBoxFormElement($attribName, "true", ($this->dataTupla[$attribName] == 1), self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_EXTERNAL_SELECTOR:
				if($attribName == "idAgente")
					return ($this->getAgente($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Agente", $this->dataTupla[$attribName], $this->getAgente($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				elseif($attribName == "idCliente")
					return ($this->getCliente($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Cliente", $this->dataTupla[$attribName], $this->getCliente($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				elseif($attribName == "idOfferta")
					return ($this->getOfferta($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Offerta", $this->dataTupla[$attribName], $this->getOfferta($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
				elseif($attribName == "idAziendaRappresentata")
					return ($this->getAziendaRappresentata($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "AziendaRappresentata", $this->dataTupla[$attribName], $this->getAziendaRappresentata($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName], self::$attribHTMLFormExtSelAssoc[$attribName]);
			//per il campo data il valore di default è la data corrente
			case FORM_DATE:
				$timeVal = is_int($this->dataTupla[$attribName]) ? $this->dataTupla[$attribName] : Utils::mySqlDateFormatToUnixTimestamp($this->dataTupla[$attribName]);
				return ModelUtils::getDateFormElement($attribName, $timeVal, self::$attribHTMLFormIsMandatory[$attribName]);
			default: return "";
		}
		return "";
	}

	/**
	 * Costruttore che acquisisce l'array dei valori associativi.
	 * @param type $data L'array associativo a cui inizializzare questa istanza.
	 */
	public function __construct($data = NULL)
	{
		parent::__construct($data);
	}

	/**
	 * Crea una nuova istanza della sottoclasse specializzante.
	 * @param array $data I dati passati da cui recuperare i valori.
	 * @return mixed Una nuova instanza della sottoclasse specializzante.
	 */
	public function createNew($data)
	{
		if(isset($data["Data"]) && is_array($data["Data"]))
			$data["Data"] = ModelUtils::getDateFromFormRequest("Data", $data);
		if(isset($data["OpzioneIbanBancaAziendaRappresentata"]) && ($data["OpzioneIbanBancaAziendaRappresentata"] == "true" || $data["OpzioneIbanBancaAziendaRappresentata"] == 1))
			$data["OpzioneIbanBancaAziendaRappresentata"] = 1;
		else
			$data["OpzioneIbanBancaAziendaRappresentata"] = 0;
		$res = new Ordine($data);
		//se l'array contiene già le informazioni sull'agente lo si crea direttamente anch'esso
		if(isset($data["NomeAgente"]) && isset($data["CognomeAgente"]) && isset($data["idAgente"]))
		{
			$agenteData = array();
			$agenteData[STD_ID] = $data["idAgente"];
			$agenteData["Nome"] = $data["NomeAgente"];
			$agenteData["Cognome"] = $data["CognomeAgente"];
			$res->chachedAgente = Agente::getInstance()->createNew($agenteData);
		}
		//se l'array contiene già le informazioni sull'azienda produttrice la si crea direttamente anch'essa
		if(isset($data["RagsocAziendaRappresentata"]) && isset($data["idAziendaRappresentata"]))
		{
			$produttoreData = array();
			$produttoreData[STD_ID] = $data["idAziendaRappresentata"];
			$produttoreData["Ragsoc"] = $data["RagsocAziendaRappresentata"];
			$res->chachedAziendaRappr = AziendaRappresentata::getInstance()->createNew($produttoreData);
		}
		//se l'array contiene già le informazioni sull'offerta la si crea direttamente anch'essa
		if(isset($data["OggettoOfferta"]) && isset($data["idOfferta"]))
		{
			$offertaData = array();
			$offertaData[STD_ID] = $data["idOfferta"];
			$offertaData["Oggetto"] = $data["OggettoOfferta"];
			$res->chachedOfferta = Offerta::getInstance()->createNew($offertaData);
		}
		//se l'array contiene già le informazioni sul cliente lo si crea direttamente anch'esso
		if(isset($data["RagsocCliente"]) && isset($data["idCliente"]))
		{
			$clienteData = array();
			$clienteData[STD_ID] = $data["idCliente"];
			$clienteData["Ragsoc"] = $data["RagsocCliente"];
			$clienteData["TipoCliente"] = $data["TipoCliente"];
			$res->chachedCliente = AziendaRappresentata::getInstance()->createNew($clienteData);
		}
		return $res;
	}

	/**
	 * Aggiungi i valori di questa istanza al DB. L'ID di questa istanza
	 * assumerà il valore della chiave primaria della tupla appena inserita nel
	 * DB.
	 * @param DatabaseManager $db Database su cui effettuare l'INSERT.
	 * @return boolean Restituisce vero se l'INSERT è andato a buon fine, falso
	 * altrimenti.
	 */
	public function addToDB($db)
	{
		if(is_int($this->dataTupla["Data"]))
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($this->dataTupla["Data"]);
		if($this->dataTupla["NOrdine"] === "" || $this->dataTupla["NOrdine"] === NULL)//se ordine non è specificato
		{
			if($this->dataTupla["idAziendaRappresentata"] > 0)//c'è un produttore specificato
			{
				$currYear = date("Y", Utils::mySqlDateFormatToUnixTimestamp($this->dataTupla["Data"]));
				$cond = "idAziendaRappresentata = ".$this->dataTupla["idAziendaRappresentata"]." AND YEAR(Data) = ".$currYear;
				$res = $db->GetRecord($this->attribTableName, "MAX(NOrdine) AS UltimoOrdine", $cond);
				if($res)
				{
					if($res["UltimoOrdine"] === NULL)
						$res["UltimoOrdine"] = 0;
					$this->dataTupla["NOrdine"] = ($res["UltimoOrdine"]+1);
				}
			}
			else
				$this->dataTupla["NOrdine"] = NULL;
		}
		return parent::addToDB($db);
		/*if(is_int($this->dataTupla["Data"]))
		{
			$intData = $this->dataTupla["Data"];
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($intData);
			$res = parent::addToDB($db);
			$this->dataTupla["Data"] = $intData;
			return $res;
		}
		else
			return parent::addToDB($db);*/
	}

	/**
	 * Aggiorna I dati nel DB con quelli di questa istanza.
	 * @param DatabaseManager $db Database su cui effettuare l'UPDATE.
	 * @return boolean Restituisce vero se l'UPDATE è andato a buon fine, falso
	 * altrimenti.
	 */
	public function updateDB($db)
	{
		if(is_int($this->dataTupla["Data"]))
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($this->dataTupla["Data"]);
		if($this->dataTupla["NOrdine"] === "" || $this->dataTupla["NOrdine"] === NULL)//se ordine non è specificato
		{
			if($this->dataTupla["idAziendaRappresentata"] > 0)//c'è un produttore specificato
			{
				$currYear = date("Y", Utils::mySqlDateFormatToUnixTimestamp($this->dataTupla["Data"]));
				$cond = STD_ID." <> ".$this->dataTupla[STD_ID]." AND idAziendaRappresentata = ".$this->dataTupla["idAziendaRappresentata"]." AND YEAR(Data) = ".$currYear;
				$res = $db->GetRecord($this->attribTableName, "MAX(NOrdine) AS UltimoOrdine", $cond);
				if($res)
				{
					if($res["UltimoOrdine"] === NULL)
						$res["UltimoOrdine"] = 0;
					$this->dataTupla["NOrdine"] = ($res["UltimoOrdine"]+1);
				}
			}
			else
				$this->dataTupla["NOrdine"] = NULL;
		}
		return parent::updateDB($db);
		/*if(is_int($this->dataTupla["Data"]))
		{
			$intData = $this->dataTupla["Data"];
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($intData);
			$res = parent::updateDB($db);
			$this->dataTupla["Data"] = $intData;
			return $res;
		}
		else
			return parent::updateDB($db);*/
	}

	/**
	 * Duplica i valori di una tupla, nel DB.
	 * Eventuali sottoclassi potrebbero implementare questo metodo per duplicare
	 * anche le associazioni NxN con un altra tabella.
	 * @param DatabaseManager $db Database su cui effettuare l'INSERT.
	 * @return mixed Restituisce l'istanza corrispondete alla nuova tupla se
	 * l'INSERT è andato a buon fine, NULL altrimenti.
	 */
	public function duplicateInDB($db)
	{
		$oldid = $this->dataTupla[STD_ID];
		//------------$newInst = parent::duplicateInDB($db);-------
		mysql_query("SET CHARACTER SET 'utf8'");
		$newInst = $this->getFromDB($db, $this->dataTupla[STD_ID]);
		if(!$newInst)
			return NULL;
		$newInst->dataTupla["NOrdine"] = NULL;
		if(!$newInst->addToDB($db))
			return NULL;
		//---------------------------------------------------------
		ArticoloOrdine::getInstance()->duplicateFromIDOrdine($db,$oldid,$newInst->dataTupla[STD_ID]);
		VariazioneArticoloOrdine::getInstance()->duplicateFromIDOrdine($db,$oldid,$newInst->dataTupla[STD_ID]);
		return $newInst;
	}

	/**
	 * Metodo che restituisce una etichetta che rappresenta il valore di un
	 * attributo: nella sua versione di default ritorna esattamente il valore
	 * associato a quell'attributo, ma è possibile implementarlo nelle
	 * sottoclassi per specificare opportuni comportamenti, come ad esempio di
	 * non far stampare un numero che rappresenta una chiave esterna, ma invece
	 * una etichetta della tupla ad essa associata.
	 * @param DatabaseManager $db Database su cui poter effettuare una possibile
	 * interrogazione.
	 * @param string $attrib Attributo di cui stampare l'etichetta del valore.
	 * @return string Il valore associato all'attributo o NULL se l'attributo
	 * non è stato trovato.
	 */
	public function getDataLabel($db, $attrib)
	{
		if($attrib == "idAgente")
			return $this->getAgente($db) == NULL ? "" : $this->getAgente($db)->getLabel();
		if($attrib == "idCliente")
			return $this->getCliente($db) == NULL ? "" : $this->getCliente($db)->getLabel();
		if($attrib == "idOfferta")
			return $this->getOfferta($db) == NULL ? "" : $this->getOfferta($db)->getLabel();
		if($attrib == "idAziendaRappresentata")
			return $this->getAziendaRappresentata($db) == NULL ? "" : $this->getAziendaRappresentata($db)->getLabel();
		if($attrib == "Data")
			return is_int($this->dataTupla[$attrib]) ? 
					Utils::textualDateFormat($this->dataTupla[$attrib]) :
					Utils::textualDateFormat(Utils::mySqlDateFormatToUnixTimestamp($this->dataTupla[$attrib]));
		if($attrib == "OpzioneIbanBancaAziendaRappresentata")
			return $this->dataTupla[$attrib] ? "Si" : "No";
		return parent::getDataLabel($db, $attrib);
	}

	private $chachedAgente = NULL;
	private $chachedCliente = NULL;
	private $chachedAziendaRappr = NULL;
	private $chachedOfferta = NULL;

	/**
	 * Ritorna una istanza di Agente corrispondente alla chiave esterna
	 * "idAgente" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return Agente L'instanza creata o NULL in caso di errore.
	 */
	public function getAgente($db)
	{
		$idag = isset($this->dataTupla["idAgente"]) ? $this->dataTupla["idAgente"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedAgente == NULL || $this->chachedAgente->dataTupla[STD_ID] != $idag)
			{
				$this->chachedAgente = Agente::getInstance()->getFromDB($db, $this->dataTupla["idAgente"]);
				return $this->chachedAgente;
			}
			else
				return $this->chachedAgente;
		}
		return NULL;
	}

	/**
	 * Ritorna una istanza di Cliente corrispondente alla chiave esterna
	 * "idCliente" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return Cliente L'instanza creata o NULL in caso di errore.
	 */
	public function getCliente($db)
	{
		$idag = isset($this->dataTupla["idCliente"]) ? $this->dataTupla["idCliente"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedCliente == NULL || $this->chachedCliente->dataTupla[STD_ID] != $idag)
			{
				$this->chachedCliente = Cliente::getInstance()->getFromDB($db, $this->dataTupla["idCliente"]);
				return $this->chachedCliente;
			}
			else
				return $this->chachedCliente;
		}
		return NULL;
	}
	
	/**
	 * Ritorna una istanza di Offerta corrispondente alla chiave esterna
	 * "idOfferta" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return Offerta L'instanza creata o NULL in caso di errore.
	 */
	public function getOfferta($db)
	{
		$idag = isset($this->dataTupla["idOfferta"]) ? $this->dataTupla["idOfferta"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedOfferta == NULL || $this->chachedOfferta->dataTupla[STD_ID] != $idag)
			{
				$this->chachedOfferta = Offerta::getInstance()->getFromDB($db, $this->dataTupla["idOfferta"]);
				return $this->chachedOfferta;
			}
			else
				return $this->chachedOfferta;
		}
		return NULL;
	}
	
	/**
	 * Ritorna una istanza di AziendaRappresentata corrispondente alla chiave
	 * esterna "idAziendaRappresentata" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return AziendaRappresentata L'instanza creata o NULL in caso di errore.
	 */
	public function getAziendaRappresentata($db)
	{
		$idag = isset($this->dataTupla["idAziendaRappresentata"]) ? $this->dataTupla["idAziendaRappresentata"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedAziendaRappr == NULL || $this->chachedAziendaRappr->dataTupla[STD_ID] != $idag)
			{
				$this->chachedAziendaRappr = AziendaRappresentata::getInstance()->getFromDB($db, $this->dataTupla["idAziendaRappresentata"]);
				return $this->chachedAziendaRappr;
			}
			else
				return $this->chachedAziendaRappr;
		}
		return NULL;
	}

	/**
	 * Carica dal DB una lista di istanze di questa sottoclasse caricate con i
	 * valori delle tuple trovate secondo le specifiche passate.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function getListFromDB($db, $limitMin, $limitMax, $orderBy, $cond = "")
	{
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		$rs = $db->EnumerateTableStartExt(self::joinSelect, self::joinTable, $orderBy,$cond,$limits);
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}
	
	/**
	 * Carica dal DB una lista di istanze di questa sottoclasse caricate con i
	 * valori delle tuple trovate secondo le specifiche passate.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function getListFromDBByIDCliente($db, $idCliente, $limitMin = NULL , $limitMax = NULL, $orderBy = "")
	{
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		$rs = $db->EnumerateTableStartExt(self::joinSelect, self::joinTable, $orderBy,"idCliente = ".$idCliente,$limits);
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}

	/**
	 * Cerca una serie di tuple nel DB e ritorna tante istanze della sottoclasse
	 * specializzante, quante sono le rispettive tuple trovate con i rispettivi
	 * valori caricati entro i limiti specificati.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param string $paramName Nome dell'attributo su cui effettuare la
	 * ricerca.
	 * @param string $paramValue Valore che l'attributo deve assumere per
	 * includere la sua rispettiva tupla.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function searchByParam($db, $paramName, $paramValue, $limitMin, $limitMax, $orderBy)
	{
		/*
		const joinSelectForSearchQuery = "Ordine.*, Agente.Nome AS NomeAgente, Agente.Cognome AS CognomeAgente, AziendaRappresentata.Ragsoc AS RagsocAziendaRappresentata, Cliente.Ragsoc AS RagsocCliente, Offerta.Oggetto AS OggettoOfferta";
		 */
		if(!isset($this->attribIsNumeric[$paramName]))
			return NULL;
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		$cond = NULL;
		if($paramName == "idAgente")
		{
			//se il parametro della ricerca è idAgente, allora la ricerca si effettua su Nome e Cognome dell'agente
			$cond = "Agente.Nome LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%' OR Agente.Cognome LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		elseif($paramName == "idCliente")
		{
			//se il parametro della ricerca è idCliente, allora la ricerca si effettua su Ragsoc del cliente
			$cond = "Cliente.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		elseif($paramName == "idOfferta")
		{
			//se il parametro della ricerca è idOfferta, allora la ricerca si effettua su Oggetto dell'offerta
			$cond = "Offerta.Oggetto LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		elseif($paramName == "idAziendaRappresentata")
		{
			//se il parametro della ricerca è idAziendaRappresentata, allora la ricerca si effettua su Ragsoc dell'azienda
			$cond = "AziendaRappresentata.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		else
		{
			//caso contrario si effettua sul parametro specificato come di norma
			$paramIsNumeric = $this->attribIsNumeric[$paramName];
			if($paramName == STD_ID)
				$paramName = $this->attribTableName.".".STD_ID;
			$cond = ($paramIsNumeric ? $paramName." = ".$paramValue : $paramName." LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'");
		}
		$rs = $db->EnumerateTableStartExt(self::joinSelectForSearchQuery, self::joinTableForSearchQuery, $orderBy, $cond, $limits );
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}

	/**
	 * Restituiscce il numero di tuple del risultato della ricerca.
	 * @param DatabaseManager $db Database da interrogare.
	 * @param string $searchAttrib Nome dell'attributo su cui effettuare la
	 * ricerca.
	 * @param string $searchVal Valore che l'attributo deve assumere per far
	 * contare la propria tupla.
	 * @return int Restituisce il numero di tuple trovate o FALSE in caso di
	 * errore.
	 */
	public function getRecordsNumOfSearchResult($db,$searchAttrib,$searchVal)
	{
		if(!isset($this->attribIsNumeric[$searchAttrib]))
			return FALSE;
		$cond = NULL;
		if($searchAttrib == "idAgente")
		{
			//se il parametro della ricerca è idAgente, allora la ricerca si effettua su Nome e Cognome dell'agente
			$cond = "Agente.Nome LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%' OR Agente.Cognome LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		elseif($searchAttrib == "idCliente")
		{
			//se il parametro della ricerca è idCliente, allora la ricerca si effettua su Ragsoc del cliente
			$cond = "Cliente.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		elseif($searchAttrib == "idOfferta")
		{
			//se il parametro della ricerca è idOfferta, allora la ricerca si effettua su Oggetto dell'offerta
			$cond = "Offerta.Oggetto LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		elseif($searchAttrib == "idAziendaRappresentata")
		{
			//se il parametro della ricerca è idAziendaRappresentata, allora la ricerca si effettua su Ragsoc dell'azienda
			$cond = "AziendaRappresentata.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		else
		{
			//caso contrario si effettua sul parametro specificato come di norma
			$paramIsNumeric = $this->attribIsNumeric[$searchAttrib];
			if($searchAttrib == STD_ID)
				$searchAttrib = $this->attribTableName.".".STD_ID;
			$cond = ($paramIsNumeric ? $searchAttrib." = ".$searchVal : $searchAttrib." LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'");
		}
		return $db->GetRecordsNum(self::joinTableForSearchQuery,$cond);
	}

	/**
	 * Stampa lo stream di byte di un file excel rappresentante la stampa del
	 * model di questa istanza.
	 * @return int Ritorna il codice rappresentativo del successo o insuccesso
	 * dell'operazione.
	 */
	public function printExcelFile($db)
	{
		return self::PRINT_NOT_SUPPORTED;
	}

	/**
	 * Stampa lo stream di byte di un file PDF rappresentante la stampa del
	 * model di questa istanza.
	 * @return int Ritorna il codice rappresentativo del successo o insuccesso
	 * dell'operazione.
	 */
	public function printHTMLFile($db)
	{
		if(!isset($this->dataTupla[STD_ID]) || $this->dataTupla[STD_ID] == NULL || $this->getCliente($db) == NULL || $this->getAziendaRappresentata($db) == NULL || $this->getAgente($db) == NULL)
		{
			$this->setLastPrintError("I parametri passati non sono corretti!");
			return self::PRINT_FILE_FAILED;
		}
		$this->cutLongStrings(false);
		date_default_timezone_set('Europe/Rome');
		$logopath = "img/logo_stampa.jpg";
		$cliente = $this->getCliente($db);
		$produttore = $this->getAziendaRappresentata($db);
		$offerta = $this->getOfferta($db);
		$agente = $this->getAgente($db);
		//-----------INFORMAZIONI DEL CLIENTE-------------------
		$clienteInfosTab = array();
		//ragione sociale
		if(($c_ragsoc = $cliente->getDataLabel($db, "Ragsoc")) != "")
			$clienteInfosTab[] = "Rag. Soc.: ".$c_ragsoc;
		//indirizzo
		if(($c_indir = $cliente->getDataLabel($db, "Indirizzo")) != "")
			$clienteInfosTab[] = "Indirizzo: ".$c_indir;
		//località
		$cap = $cliente->getDataLabel($db, "CAP");
		$citta = $cliente->getDataLabel($db, "Citta");
		$prov = $cliente->getDataLabel($db, "Provincia");
		if($cap != "" || $citta != "" || $prov != "")
		{
			if($prov != "")
				$prov = "(".$prov.")";
			$clienteInfosTab[] = "Localit&agrave;: ".$cap." ".$citta." ".$prov;
		}
		//telefono, cellulare e fax
		$c_tel_complete = "";
		if(($c_tel = $cliente->getDataLabel($db, "Telefono")) != "")
			$c_tel_complete .= "Telefono: ".$c_tel."&nbsp;";
		if(($c_cel = $cliente->getDataLabel($db, "Cellulare")) != "")
			$c_tel_complete .= "Cellulare: ".$c_cel."&nbsp;";
		if(($c_fax = $cliente->getDataLabel($db, "Fax")) != "")
			$c_tel_complete .= "Fax: ".$c_fax;
		if($c_tel_complete != "")
			$clienteInfosTab[] = $c_tel_complete;
		//referente (se presente nell'offerta, prende quello altrimenti cerca in cliente)
		if($offerta != NULL && ($c_ref = $offerta->getDataLabel($db, "Referente")) != "")
			$clienteInfosTab[] = "Referente: ".$c_ref;
		elseif(($c_ref = $cliente->getDataLabel($db, "Referente")) != "")
			$clienteInfosTab[] = "Referente: ".$c_ref;
		//codice fiscale
		if(($c_codFisc = $cliente->getDataLabel($db, "CodiceFiscale")) != NULL)
			$clienteInfosTab[] = "Cod. Fisc.: ".$c_codFisc;
		//partita iva
		if(($c_partIVA = $cliente->getDataLabel($db, "PartitaIVA")) != NULL)
			$clienteInfosTab[] = "Partita IVA: ".$c_partIVA;
		//tipo cliente
		$clienteTipo = "Tipo cliente: <b>".$cliente->getDataLabel($db, "TipoCliente")."</b>";
		//-----------INFORMAZIONI DEL PRODUTTORE-------------------
		$aziendaRapprInfo = array();
		$aziendaRapprInfo[0] = $produttore->getDataLabel($db, "Ragsoc");
		if($this->getDataLabel($db, "OpzioneIbanBancaAziendaRappresentata") == "Si")
		{
			$aziendaRapprInfo[1] = "";
			if(($az_banca = $this->getDataLabel($db, "BancaAziendaRappresentata")) != "")
				$aziendaRapprInfo[1] = "Banca: ".$az_banca." ";
			if(($az_IBAN = $this->getDataLabel($db, "IbanAziendaRappresentata")) != "")
				$aziendaRapprInfo[1] .= "IBAN: ".$az_IBAN;
		}
		$aziendaRapprLogo = $produttore->getLogoDataLabel("width='100%'");
		//-----------INFORMAZIONI ARTICOLI-------------------
		$varArticoliList = VariazioneArticoloOrdine::getInstance()->getListFromDBByIDOrdine($db, $this->dataTupla[STD_ID]);
		if($varArticoliList === NULL)
			$varArticoliList = array();
		$articoliList = ArticoloOrdine::getInstance()->getListFromDBByIDOrdine($db, $this->dataTupla[STD_ID]);
		if($articoliList === NULL)
			$articoliList = array();
		$varArticoliUM = array();

		$totaleOrdine = 0;
		foreach($varArticoliList as $k => $varArticolo)
		{
			$varArticolo->cutLongStrings(false);
			$totaleOrdine += $varArticolo->dataTupla["Totale"];
			foreach($articoliList as $articolo)
			{
				if($varArticolo->getVariazioneArticolo($db)->dataTupla["idArticolo"] == $articolo->getArticolo($db)->dataTupla[STD_ID])
				{
					$varArticoliUM[$k] = $articolo->getArticolo($db)->getDataLabel($db, "UM");
					break;
				}
			}
		}

		$IVA = (float)Parameters::getParameter($db, Parameters::PARAMETER_IVA);
		$totaleOrdineIVA = $totaleOrdine*$IVA/100;
		$totaleOrdineConIVA = $totaleOrdine+$totaleOrdineIVA;
		//-----------INFORMAZIONI DESTINAZIONE MERCE-------------------
		$destIndirizzo = "Indirizzo: ".$this->getDataLabel($db, "Indirizzo");
		$destContatto = $this->getDataLabel($db, "Contatto");
		if($destContatto != "")
			$destContatto = "Contatto per consegna: ".$destContatto;
		$destTermini = $this->getDataLabel($db, "TermineDiConsegna");
		if($destTermini != "")
			$destTermini = "Termine di consegna: ".$destTermini;
		//-----------INFORMAZIONI PAGAMENTO CLIENTE-------------------
		$pagamNumOrdine = "N. ordine del cliente: ".$this->getDataLabel($db, "OrdineDelCliente");
		$pagamCup = "CUP: ".$this->getDataLabel($db, "Cup");
		$pagamCig = "CIG: ".$this->getDataLabel($db, "Cig");
		$pagamTrasporto = $this->getDataLabel($db, "Trasporto");
		if($pagamTrasporto != "")
			$pagamTrasporto = "Trasporto: ".$pagamTrasporto;
		$pagamPagamento = $this->getDataLabel($db, "Pagamento");
		if($pagamPagamento != "")
			$pagamPagamento = "Pagamento: ".$pagamPagamento;
		$pagamBancaIBAN = "";
		if(($pag_banca = $this->getDataLabel($db, "BancaCliente")) != "")
				$pagamBancaIBAN = "Banca Cliente: ".$pag_banca."&nbsp &nbsp"; //Ci dovrebbe andare il carattere di Tab in HTML ma non funzionava
		if(($pag_iban = $this->getDataLabel($db, "IbanCliente")) != "")
				$pagamBancaIBAN = $pagamBancaIBAN."IBAN Cliente: ".$pag_iban;
		$pagamMailCliente = array();
		if(($pag_m = $this->getDataLabel($db, "E_MailCommerciale")) != "")
			$pagamMailCliente[] = "E-Mail commerciale:<br/>".$pag_m;
		if(($pag_m = $this->getDataLabel($db, "E_MailTecnica")) != "")
			$pagamMailCliente[] = "E-Mail tecnico:<br/>".$pag_m;
		if(($pag_m = $this->getDataLabel($db, "E_MailAmministrativa")) != "")
			$pagamMailCliente[] = "E-Mail amministrativo:<br/>".$pag_m;
		if(($pag_m = $this->getDataLabel($db, "E_MailPec")) != "")
			$pagamMailCliente[] = "E-Mail PEC:<br/>".$pag_m;
		//-----------NOTE-------------------
		$note = LayoutUtils::getDataLabelInHTML($this->getDataLabel($db, "Note"));
		//----------STILI-------------------
		/*
	<style>
		@font-face
		{
			font-family: 'Vladimir Script';
			src: url('img/VLADIMIR.TTF');
		}
		.headingCell {
			border: #000 solid thin;
			font-weight: bold;
		}
		.borderCell {
			border: #000 solid thin;
		}
		.numberCell {
			text-align: right;
		}
		.newCategoryTable {
			border-color: #000;
			border-style: solid;
			border-width: thin 0px thin 0px;
			margin-bottom: 5px;
			font-family: Verdana;
			font-size: 12px;
			border-collapse:collapse;
		}
		.innerTable {
			margin-bottom: 5px;
			font-family: Verdana;
			font-size: 12px;
			border-collapse:collapse;
		}
	</style>
		 */

		$classStyle_headingCell = "border: #000 solid thin; font-weight: bold;";
		//$classStyle_borderCell = "border: #000 solid thin;";
		$classStyle_numberCell = "text-align: right;";
		$classStyle_newCategoryTable = "border-color: #000; border-style: solid; border-width: thin 0px thin 0px; margin-bottom: 5px; font-family: Verdana; font-size: 14px; border-collapse:collapse;";
		$classStyle_innerTable = "margin-bottom: 5px; font-family: Verdana; font-size: 12px; border-collapse:collapse;";

		?>
			<table width="1000" cellpadding="0" cellspacing="0" border="0" style='font-family: Verdana; border-collapse:collapse;'>
				<tr>
					<td width="35%"><img src=<?= '"'.$logopath.'"' ?> width='100%' /></td>
					<td width="35%"><div style="padding: 20px;"><?= $aziendaRapprLogo ?></div></td>
					<td width="30%" style="text-align: right;">
						<table>
							<tr><td style="text-align: left; font-size: 16px;">Ordine N&deg;:</td><td style="text-align: center; font-size: 16px;"><?= $this->getDataLabel($db, "NOrdine") ?></td></tr>
							<tr><td style="text-align: left; font-size: 16px;">Data:</td><td style="text-align: center; font-size: 16px;"><?= $this->getDataLabel($db, "Data") ?></td></tr>
						</table>
				</tr>
				<tr>
					<td width="34%"></td>
					<td width="33%"><div style="padding: 20px 20px 20px 20px; text-align: center; font-size: 18px;"><?= "<b>".$aziendaRapprInfo[0]."</b><br/>".(isset($aziendaRapprInfo[1]) ? $aziendaRapprInfo[1] : "") ?></td>
					<td width="33%"></td>
				</tr>
			</table><br/>
			<!-- INFO CLIENTE -->
			<table width="1000" style="<?= $classStyle_newCategoryTable ?>" cellpadding="10" cellspacing="0" border="0">
				<tr>
					<td width="50%" style="<?= $classStyle_headingCell ?>">Cliente &#47; Indirizzo di Fatturazione:</td>
					<td width="50%" style="text-align: right;"><?= $clienteTipo ?></td>
				</tr>
				<?php
				$ic = count($clienteInfosTab);
				$rowsnum = ceil((float)$ic/2);
				for($i = 0; $i < $rowsnum; $i++)
				{
					$datac1 = isset($clienteInfosTab[$i]) ? $clienteInfosTab[$i] : "";
					$datac2 = isset($clienteInfosTab[$i+$rowsnum]) ? $clienteInfosTab[$i+$rowsnum] : "";
					echo("<tr><td>".$datac1."</td><td>".$datac2."</td></tr>");
				}
				?>
			</table><br/>
			<!-- INFO AGENTE -->
			<table width="1000" style="<?= $classStyle_newCategoryTable ?>" cellpadding="10" cellspacing="0" border="0">
				<tr>
					<td width="20%" style="<?= $classStyle_headingCell ?>">Agente di riferimento:</td>
					<td style="text-align: left;"><?= $agente->getLabel() ?></td>
				</tr>
			</table><br/>
			<!-- INFO ARTICOLI -->
			<table width="1000" style="<?= $classStyle_innerTable ?>" cellpadding="5" cellspacing="0" border="1">
				<!--<tr id="intestazioneArticoli" style="font-size: 14px; font-weight: bold; text-align: center;">
					<td colspan="6" style="padding: 10px 10px 10px 10px;">PRODOTTI:</td>
				</tr>-->
				<tr id="intestazioneArticoli" style="text-align: center; vertical-align: middle; font-weight: bold;">
					<td style="padding:5px;">CODICE</td>
					<td style="padding:5px;">DESCRIZIONE</td>
					<td style="padding:5px;">UM</td>
					<td style="padding:5px;">QUANT.</td>
					<td style="padding:5px;">P. NETTO<br/>UNITARIO</td>
					<td style="padding:5px;">IMPORTO<br/>TOTALE</td>
				</tr>
				<tr id="subIntestazioneArticoli" style="font-weight: bold; font-style: italic; font-size: 10px; text-align: center;">
					<td colspan="4"></td>
					<td>Iva esclusa</td>
					<td>Iva esclusa</td>
				</tr>
				<?php

					foreach($varArticoliList as $k => $varArticolo)
					{
						?>
				<tr id="varArticoloArea">
					<td style="font-weight: bold; text-align: center;">&nbsp;<?= $varArticolo->getDataLabel($db,"Codice") ?>&nbsp;</td>
					<td><?= $varArticolo->getDataLabel($db,"DettagliTecnici") ?>&nbsp;</td>
					<td><?= $varArticoliUM[$k] ?>&nbsp;</td>
					<td style="<?= $classStyle_numberCell ?>">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"Quantita"), 2, ",", ".") ?></td>
					<td style="<?= $classStyle_numberCell ?> font-weight: bold;">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"PrezzoNetto"), 2, ",", ".") ?></td>
					<td style="<?= $classStyle_numberCell ?> font-weight: bold;">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"Totale"), 2, ",", ".") ?></td>
				</tr>
				<?php
					}
				?>
			</table><br/>
			<!-- INFO TOTALE MERCE -->
			<table width="1000" style="<?= $classStyle_innerTable ?>" cellpadding="5" cellspacing="0" border="1">
				<tr style="text-align: center;">
					<td>&nbsp;</td><td>Imponibile:</td><td>IVA <?= $IVA ?>%:</td><td>Totale ordine:</td>
				</tr>
				<tr style="text-align: center;">
					<td style="text-align: left;">TOTALE:</td><td><?= number_format($totaleOrdine, 2, ",", ".") ?> &euro;</td><td><?= number_format($totaleOrdineIVA, 2, ",", ".") ?> &euro;</td><td><b><?= number_format($totaleOrdineConIVA, 2, ",", ".") ?> &euro;</b></td>
				</tr>
			</table><br/>
			<!-- INFO DESTINAIZONE MERCE -->
			<table width="1000" style="<?= $classStyle_newCategoryTable ?>" cellpadding="0" cellspacing="0" border="0">
				<tr>
					<td width="20%" style="vertical-align: top;"><div style="<?= $classStyle_headingCell ?> padding: 10px; border-top: 0px;">Destinazione merce:</div></td>
					<td>
						<table style="<?= $classStyle_innerTable ?>" width="100%" cellpadding="10">
							<tr><td><?= $destIndirizzo ?></td></tr>
							<tr><td><?= $destContatto ?></td></tr>
							<tr><td><?= $destTermini ?></td></tr>
						</table>
					</td>
				</tr>
			</table><br/>
			<!-- INFO CLIENTE/PAGAMENTO -->
			<table width="1000" style="<?= $classStyle_newCategoryTable ?>" cellpadding="0" cellspacing="0" border="0">
				<tr>
					<td width="20%" style="vertical-align: top;"><div style="<?= $classStyle_headingCell ?> padding: 10px; border-top: 0px;">Informazioni cliente:</div></td>
					<td>
						<table style="<?= $classStyle_innerTable ?>" width="100%" cellpadding="10">
							<tr>
								<td>
									<div width="100%"><table borders="0" width="100%" cellpadding="0" cellspacing="0">
										<tr>
										<?= "<td>".$pagamNumOrdine."</td><td>".$pagamCup."</td><td>".$pagamCig."</td>" ?>
										</tr>
									</table></div>
								</td>
							</tr>
							<tr><td><?= $pagamTrasporto ?></td></tr>
							<tr><td><?= $pagamPagamento ?></td></tr>
							<tr><td><?= $pagamBancaIBAN ?></td></tr>
							<tr><td>
									<table width="100%" cellpadding="5" cellspacing="0" border="0">
										<tr>
											<?php
											foreach ($pagamMailCliente as $mail)
												echo("<td>".$mail."</td>");
											?>
										</tr>
									</table>
								</td></tr>
						</table>
					</td>
				</tr>
			</table><br/>
			<!-- NOTE -->
			<table width="1000" style="<?= $classStyle_newCategoryTable ?>" cellpadding="0" cellspacing="0" border="0">
				<tr>
					<td width="20%" style="vertical-align: top;"><div style="<?= $classStyle_headingCell ?> padding: 10px; border-top: 0px;">Note:</div></td>
					<td style="padding: 10px;">
						<?= $note."&nbsp;" ?>
					</td>
				</tr>
			</table>

		<?php
		return self::PRINT_SUCCESS;
	}

	/**
	 * Specifica se questo model supporta la stampa.
	 * @return boolean Vero se la stampa è supportata, falso altrimenti.
	 */
	public function isPrintAvailable()
	{
		return self::PRINT_HTML_AVAILABLE;
	}

}

?>
